#include <bits/stdc++.h>
using namespace std;

const int M=2e6+10,N=310,K=2*N+10;
using ll=long long;
int a[M],m;
deque<int>q[N];
struct Op {
	int t,a,b;
} ans[M<<1];
int att[N],atb[N],size[N];
priority_queue<int,vector<int>,greater<int>>id;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	freopen("meow.in","r",stdin);
	freopen("meow.out","w",stdout);
	int T,n,k,op,s1,s2,sz;
	cin>>T;
	int i,j;
	if(T%10==2) {
		while(T--) {
			op=0;
			cin>>n>>m>>k;//n==2
//			for(j=1; j<=n; ++j) {
//				id.push(j);
//			}
			for(i=1; i<=m; ++i) {
				cin>>a[i];
			}
			for(j=1; j<=m; ++j) {
				int sz=q[1].size();
				if(sz) {
					if(q[1].front()==a[j]) {
						ans[++op]= {1,2,0};
						ans[++op]= {2,1,2};
//						cout<<"1 2\n";
//						cout<<"2 1 2\n";
//						op+=2;
						q[1].pop_front();
						continue;
					}
					if(q[1].back()==a[j]) {
						ans[++op]= {1,1,0};
//						cout<<"1 1\n";
//						op+=1;
						q[1].pop_back();
						continue;
					}
				}
				if(q[1].empty()&&q[2].empty()) {
					q[1].push_back(a[j]);
					ans[++op]= {1,1,0};
//					cout<<"1 1\n";
//					op+=1;
					continue;
				}
				sz=q[2].size();
				if(sz) {
					if(q[2].front()==a[j]) {
						ans[++op]= {1,1,0};
						ans[++op]= {2,1,2};
//						cout<<"1 1\n";
//						cout<<"2 1 2\n";
//						op+=2;
						q[2].pop_front();
						continue;
					}
					if(q[2].back()==a[j]) {
						ans[++op]= {1,2,0};
//						cout<<"1 2\n";
//						op+=1;
						q[2].pop_back();
						continue;
					}
				} else {
					ans[++op]= {1,1,0};
//					cout<<"1 1\n";
				}
			}
			cout<<op<<'\n';
			for(j=1; j<=op; ++j) {
				if(ans[j].t==1) {
					cout<<"1 "<<ans[j].a<<'\n';
				} else {
					cout<<"2 "<<ans[j].a<<' '<<ans[j].b<<'\n';
				}
			}
		}
	} else {
		int now;
		while(T--) {
			memset(size,0,sizeof(size));
			cin>>n>>m>>k;
			int op=0;
			bool flag;
			for(i=1; i<=m; ++i)
				cin>>a[i];
			now=id.top();
			id.pop();
			for(i=1; i<=m; ++i) {
				flag=false;
				if(atb[a[i]]&&!id.empty()) {
					ans[++op]= {2,atb[a[i]],id.top()};
					q[atb[a[i]]].pop_front();
					size[atb[a[i]]]--;
					flag=true;
				}
				if(att[a[i]]) {
					ans[++op]= {1,att[a[i]]};
					q[att[a[i]]].pop_back();
					size[att[a[i]]]--;
					flag=true;
				}
				if(size[now]==k) {
					now=id.top();
				}
				if(flag==false) {
					
					q[now].push_back(a[i]);
					++size[a[i]];
					ans[++op]= {1,now};
					if(q[now].empty()) {
						atb[a[i]]=atb[a[i]]=now;
						id.pop();
					}
				}
				if(size[now]==0){
					now=id.top();
					id.push(now);
					
				}
			}
			while(id.size()!=n) {
				for(i=1; i<=n; ++i) {
					for(j=i+1; j<=n; ++j) {
						if(q[i].front()==q[j].front()) {
							ans[++op]={2,i,j};
							q[i].pop_front();
							q[j].pop_front();
							if(q[i].size()==0){
								id.push(i);
							}
							if(q[j].size()==0){
								id.push(j);
							}
						}
					}
				}
			}
			cout<<op<<'\n';
			for(j=1; j<=op; ++j) {
				if(ans[j].t==1) {
					cout<<"1 "<<ans[j].a<<'\n';
				} else {
					cout<<"2 "<<ans[j].a<<' '<<ans[j].b<<'\n';
				}
			}
		}
	}
	return 0;
}
